/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Clientes;

import Utilidades.imagenUtils;
import Utilidades.utils;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.sql.SQLException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

/**
 *
 * @author humberto
 */
public final class guiPrincipalClientes extends JFrame{
    
    private static guiPrincipalClientes identidad;
    private static guiPrincipalClientes instancia;
    
    private JFrame padre;
    private cCliente    cliente;
    private JLabel      lBuscar;
    private JTextField  tBuscar;
    private JLabel   foto;
    private JTable      listaTab;
    private TableRowSorter<TableModel> clasificador;
    private JButton     agregarBut;
    private JButton     editarBut;
    private JButton     eliminarBut;
    private GridBagConstraints limites;
    
    
    private guiPrincipalClientes(JFrame padre) throws HeadlessException {
        
            identidad = this;
            this.padre = padre;
            
            this.setLayout(new GridBagLayout());
            this.setTitle("Clientes");
            
            inicializarAgregarComponentes();
            inicializarListeners();
            
            this.pack();
            this.setLocationRelativeTo(null);
            this.setVisible(true);
        
    }
    
    public static guiPrincipalClientes obtenerInstancia(JFrame padre){
        
        if(instancia==null){
            instancia=new guiPrincipalClientes(padre);
            return instancia;
        }
        utils.mostrarVentana(identidad);
        return instancia;

    }
    
    public void inicializarAgregarComponentes(){
        
        try {
            cliente = new cCliente();
            
            limites = new GridBagConstraints();
                  
           
            
            lBuscar = new JLabel("Buscar Cliente (Alt + B)"); lBuscar.setDisplayedMnemonic('B'); 
            lBuscar.setFont(new java.awt.Font("Arial", 1, 17));
            limites.gridx = 0; limites.gridy =0;
            limites.gridwidth=1;limites.gridheight=1;
            limites.insets = new Insets(50, 60, 2, 2);
            add(lBuscar,limites);
                  
            tBuscar = new JTextField(40); lBuscar.setLabelFor(tBuscar);
            tBuscar.setFont(new java.awt.Font("Arial", 0, 15));
            limites.gridx = 0; limites.gridy = 1;
            limites.gridwidth=3;
            limites.insets = new Insets(10, 70, 2, 2);
            add(tBuscar,limites);



                    
            agregarBut = new JButton("Nuevo  (Ctrl + N)", new ImageIcon("figuras/add32.png"));
            agregarBut.setHorizontalTextPosition(SwingConstants.CENTER);
            agregarBut.setVerticalTextPosition(SwingConstants.BOTTOM) ;
            agregarBut.setVerticalAlignment(SwingConstants.CENTER);
            limites.gridx = 0; limites.gridy = 2;
            limites.gridheight=1;limites.gridwidth=1;
            limites.insets = new Insets(2, 60, 2, 2);
            add(agregarBut,limites);

            editarBut = new JButton("Editar (Ctrl + D)", new ImageIcon("figuras/edit32.png"));
            editarBut.setHorizontalTextPosition(SwingConstants.CENTER);
            editarBut.setVerticalTextPosition(SwingConstants.BOTTOM) ;
            editarBut.setVerticalAlignment(SwingConstants.CENTER); 
            limites.gridx = 1; limites.gridy = 2;
            limites.insets = new Insets(2, 2, 2, 2);
            add(editarBut,limites);

            eliminarBut = new JButton("Eliminar (Ctrl + E)", new ImageIcon("figuras/delete32.png"));
            eliminarBut.setHorizontalTextPosition(SwingConstants.CENTER);
            eliminarBut.setVerticalTextPosition(SwingConstants.BOTTOM) ;
            eliminarBut.setVerticalAlignment(SwingConstants.CENTER); 
            limites.gridx = 2; limites.gridy = 2;
            add(eliminarBut,limites);
            
            limites.insets = new Insets(2, 10, 2, 0);

            
            foto=new JLabel(new ImageIcon("./fotosClientes/foto.png"));
            limites.gridx = 3; limites.gridy = 0;
            limites.gridheight=3;limites.gridwidth=1;
            foto.setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
            foto.setPreferredSize(new Dimension(250, 200)); 
            add(foto,limites);
            
            
            
            
           
            Vector <String> columnNames = new Vector<String>(); columnNames.add("Cod."); 
                                               columnNames.add("DNI"); 
                                               columnNames.add("Pri.Nombre"); 
                                               columnNames.add("Seg.Nombre"); 
                                               columnNames.add("P.Apellido");
                                               columnNames.add("S.Apellido");
                                               columnNames.add("Direccion");
                                               columnNames.add("Z.Par.");
                                               columnNames.add("N.Par.");
                                               columnNames.add("Ha.Par.");
                                               columnNames.add("Teléfono Fijo");
                                               columnNames.add("Celular");
                                               
            
            Vector <Vector<String>> clientes = cliente.seleccionarTodo();
            DefaultTableModel modelo = new DefaultTableModel(clientes,columnNames){
                            
                @Override
                public boolean isCellEditable (int row, int column)
                {
                    return false;
                }
            };
            
            limites.insets = new Insets(2, 2, 2, 2);
            this.clasificador = new TableRowSorter<TableModel>(modelo);
            listaTab = new JTable(modelo); listaTab.setRowSorter(clasificador); listaTab.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            listaTab.setRowHeight(25);
            listaTab.setFont(new java.awt.Font("Arial", 0, 17)); 
            limites.gridx = 0; limites.gridy = 3; limites.gridwidth = 4; limites.gridheight = 1;
            JScrollPane barras = new JScrollPane(listaTab); barras.setPreferredSize(new Dimension(1000, 250));
            add(barras,limites);
                      
            listaTab.getColumn("Cod.").setPreferredWidth(3);
            listaTab.getColumn("Z.Par.").setPreferredWidth(3);
            listaTab.getColumn("N.Par.").setPreferredWidth(3);
            listaTab.getColumn("Ha.Par.").setPreferredWidth(3);

        
        } catch (SQLException ex) {
            Logger.getLogger(guiPrincipalClientes.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(guiPrincipalClientes.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
        public void inicializarListeners(){
            
        //PARA LA VENTANA
        //setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); 
        
        /*this.addWindowListener(new WindowAdapter(){ 
          
            public void windowClosing(WindowEvent e) { 
                
                utils.ocultarVentana(identidad);
                utils.mostrarVentana(padre);
            } 

        });
        * */
        Action actEsc = new AbstractAction() { public void actionPerformed(ActionEvent e) {
            utils.ocultarVentana(identidad);
            utils.mostrarVentana(padre);
        
        }};
        foto.getInputMap(foto.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("ESCAPE"),"accion");
        foto.getActionMap().put("accion", actEsc);
            
        if (padre != null){
            
            listaTab.addMouseListener(new MouseAdapter(){
                public void mouseClicked(MouseEvent e){ 
                    if (e.getClickCount() == 2){
                         
                        final Ventas.IAgregar padreReal = (Ventas.IAgregar) padre;
                        String codigo = listaTab.getValueAt(listaTab.getSelectedRow(),0).toString();
                        String nombre = listaTab.getValueAt(listaTab.getSelectedRow(),4).toString() + " " + listaTab.getValueAt(listaTab.getSelectedRow(),5).toString() +", " + listaTab.getValueAt(listaTab.getSelectedRow(),2).toString() + " " + listaTab.getValueAt(listaTab.getSelectedRow(),3).toString();
                        padreReal.actualizarCliente(utils.formatID(codigo,8),nombre);

                        setVisible(false);
                    }
                }
            });
        }   
        
        tBuscar.getDocument().addDocumentListener(
            new DocumentListener() {
                public void changedUpdate(DocumentEvent e) {
                    filtrar();
                }
                public void insertUpdate(DocumentEvent e) {
                    filtrar();
                }
                public void removeUpdate(DocumentEvent e) {
                    filtrar();
                }
        });
        
        
        
        
        
        //ACCION PARA EL BOTON AGREGAR
         Action actAgregar = new AbstractAction() {    
      
         public void actionPerformed(ActionEvent e) {agregarBut.doClick();}
          };
         
         agregarBut.addActionListener(new ActionListener() {

            
            public void actionPerformed(ActionEvent e) {
                
                guiAgregarCliente.obtenerInstancia(identidad);
             }
        });
        
         agregarBut.getInputMap(agregarBut.WHEN_IN_FOCUSED_WINDOW).
                 put(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_MASK),"accion");
         agregarBut.getActionMap().put("accion", actAgregar);
        
        
         //ACCION PARA EL BOTON EDITAR
         
        Action actEditar = new AbstractAction() {    
      
         public void actionPerformed(ActionEvent e) {editarBut.doClick();}
          };
         
         editarBut.addActionListener(new ActionListener() {

            
            public void actionPerformed(ActionEvent e) {
                
             try {
                       cliente = new cCliente(Integer.parseInt(listaTab.getValueAt(listaTab.getSelectedRow(),0).toString()),
                       listaTab.getValueAt(listaTab.getSelectedRow(),1).toString(),                 
                       listaTab.getValueAt(listaTab.getSelectedRow(),2).toString(),
                       listaTab.getValueAt(listaTab.getSelectedRow(),3).toString(),
                       listaTab.getValueAt(listaTab.getSelectedRow(),4).toString(),
                       listaTab.getValueAt(listaTab.getSelectedRow(),5).toString(),
                       listaTab.getValueAt(listaTab.getSelectedRow(),6).toString(),
                       listaTab.getValueAt(listaTab.getSelectedRow(),7).toString(),
                       Integer.parseInt(listaTab.getValueAt(listaTab.getSelectedRow(),8).toString()),
                       Integer.parseInt(listaTab.getValueAt(listaTab.getSelectedRow(),9).toString()),
                       Integer.parseInt(listaTab.getValueAt(listaTab.getSelectedRow(),10).toString()),
                       Integer.parseInt(listaTab.getValueAt(listaTab.getSelectedRow(),11).toString()));
               
                
                   guiEditarCliente.obtenerInstancia(identidad, cliente);
                    
                } catch (IndexOutOfBoundsException ex) {
                    JOptionPane.showMessageDialog(null,"Selecciona un Cliente a Editar","Atención!!!",JOptionPane.INFORMATION_MESSAGE);
                }
               
               
               
                
             }
        });
        
         editarBut.getInputMap(editarBut.WHEN_IN_FOCUSED_WINDOW).
                 put(KeyStroke.getKeyStroke(KeyEvent.VK_D,InputEvent.CTRL_MASK),"accion");
         editarBut.getActionMap().put("accion", actEditar);
         
         //ACCION PARA EL BOTON ELIMINAR
         
         
         Action actEliminar = new AbstractAction() {    
      
         public void actionPerformed(ActionEvent e) {eliminarBut.doClick();}
          };
         
         eliminarBut.addActionListener(new ActionListener() {

            
            public void actionPerformed(ActionEvent e) {
                 try {
                    int confirmado = JOptionPane.showConfirmDialog(null,"Seguro que desea eliminar al Cliente: " + listaTab.getValueAt(listaTab.getSelectedRow(),2).toString() + "?");

                     if (JOptionPane.OK_OPTION == confirmado){
                        boolean resultado = cliente.eliminar(Integer.parseInt(listaTab.getValueAt(listaTab.getSelectedRow(),0).toString()));
                        boolean resultadoImagen=
                                ((imagenUtils.eliminarFoto("./fotosClientes/", listaTab.getValueAt(listaTab.getSelectedRow(),1).toString()+"C"))
                                || !(imagenUtils.existeImagen("./fotosClientes/", listaTab.getValueAt(listaTab.getSelectedRow(),1).toString()+"C")));
                        
                        if (resultado == true && resultadoImagen == true){
                        JOptionPane.showMessageDialog(null,"Cliente  eliminado correctamente!","En Hora Buena!!!",JOptionPane.INFORMATION_MESSAGE);    
                            actualizarData();
                        }
                     }
                     else{
                     JOptionPane.showMessageDialog(null,"No se realizó Ningún Cambio!","Advertencia!",JOptionPane.WARNING_MESSAGE);
                     }
                     
                         
                } catch (SQLException ex) {
                    Logger.getLogger(guiPrincipalClientes.class.getName()).log(Level.SEVERE, null, ex);
                    JOptionPane.showMessageDialog(null,"Error de la Base de Datos!","Error Letal!!!",JOptionPane.ERROR_MESSAGE);
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(guiPrincipalClientes.class.getName()).log(Level.SEVERE, null, ex);
                    JOptionPane.showMessageDialog(null,"Error de la Base de Datos!","Error Letal!!!",JOptionPane.ERROR_MESSAGE);
                }catch (IndexOutOfBoundsException exe) {
                    JOptionPane.showMessageDialog(null,"Selecciona un Cliente a Eliminar","Atención!!!",JOptionPane.INFORMATION_MESSAGE);
                }
            }
        });
        
         eliminarBut.getInputMap(eliminarBut.WHEN_IN_FOCUSED_WINDOW).
                 put(KeyStroke.getKeyStroke(KeyEvent.VK_E,InputEvent.CTRL_MASK),"accion");
         eliminarBut.getActionMap().put("accion", actEliminar);
         
     
          //ACCION PARA LA TABLA
         
         listaTab.addMouseListener(new MouseAdapter() {
         public void mouseClicked(MouseEvent e) {
             if (e.getClickCount() == 1) {
                 
                 actualizarFoto(listaTab.getValueAt(listaTab.getSelectedRow(),1).toString());
                  
    }
  }
});
    
    }
    
    private void filtrar() {
        RowFilter<TableModel, Object> rf = null;
        try {
            rf = RowFilter.regexFilter(tBuscar.getText());
        } catch (java.util.regex.PatternSyntaxException e) {
            return;
        }
        clasificador.setRowFilter(rf);
    }
    
    public void actualizarData() throws SQLException, ClassNotFoundException{
            
            Vector<String> columnNames = new Vector<String>(); 
                                               columnNames.add("Cod."); 
                                               columnNames.add("DNI"); 
                                               columnNames.add("Pri.Nombre"); 
                                               columnNames.add("Seg.Nombre"); 
                                               columnNames.add("P.Apellido");
                                               columnNames.add("S.Apellido");
                                               columnNames.add("Direccion");
                                               columnNames.add("Z.Par.");
                                               columnNames.add("N.Par.");
                                               columnNames.add("Ha.Par.");
                                               columnNames.add("Teléfono Fijo");
                                               columnNames.add("Celular");
                                               
            Vector <Vector<String>> data = cCliente.seleccionarTodo();

            DefaultTableModel modelo = new DefaultTableModel(data,columnNames);
            
            clasificador = new TableRowSorter<TableModel>(modelo);
            listaTab.setModel(modelo); listaTab.setRowSorter(clasificador); listaTab.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            
    }
    
      public void actualizarFoto(final String imagen){
        
        if(new File("./fotosClientes/"+imagen+"C.png").exists()){        
        foto.setIcon(new ImageIcon("fotosClientes/"+imagen+"C.png"));
              identidad.pack();}
        else{foto.setIcon(new ImageIcon("./fotosClientes/foto.png"));
              identidad.pack();}       
    }
    
}
